import axios from 'axios'
import {
    MessageBox,
    Message
} from 'element-ui'
import store from '@/store'
import {
    getToken,
    removeToken
} from '@/utils/auth'

// 判断登录弹出层是否已经弹出
let isShowAlert = false;

// create an axios instance
const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    // withCredentials: true, // send cookies when cross-domain requests
    timeout: 60000 // request timeout
})

// request interceptor
service.interceptors.request.use(
    config => {
        // do something before request is sent
        if (store.getters.token) {
            // let each request carry token
            // ['X-Token'] is a custom headers key
            // please modify it according to the actual situation
            // config.headers['X-Token'] = getToken()
            config.headers['token'] = getToken()
        }
        // 做导出的公共处理
        // if (config.params && config.params.export == 1) {
        //     var data = Object.assign({}, config.params)
        //     if (data.start_time) {
        //         data.start_time = new Date(data.start_time).toISOString();
        //     }
        //     if (data.end_time) {
        //         data.end_time = new Date(data.end_time).toISOString();
        //     }
        //     var params = [];
        //     for (var i in data) {
        //         if (data[i] && i != "page" && i != "limit") {
        //             params.push(i + "=" + data[i])
        //         }
        //     }
        //     params = params.join("&")
        //     window.open(config.baseURL + config.url + "?" + params + "&token=" + config.headers.Authorization)
        //     const CancelToken = axios.CancelToken;
        //     return {
        //         cancelToken: new CancelToken((cancel) => cancel())
        //     };
        // }
        return config
    },
    error => {
        // do something with request error
        console.log(error) // for debug
        return Promise.reject(error)
    }
)

// response interceptor
service.interceptors.response.use(
    /**
     * If you want to get http information such as headers or status
     * Please return  response => response
     */

    /**
     * Determine the request status by custom code
     * Here is just an example
     * You can also judge the status by HTTP Status Code
     */
    response => {
        const res = response.data
            // if the custom code is not 20000, it is judged as an error.
        if (res.code !== 20000 && res.code !== 200 && response.status != 200) {
            if (res.code === 500 || res.code === 422) {
                Message({
                    message: res.msg || res.info || res.message || 'Error',
                    type: 'error',
                    duration: 5 * 1000
                })
            } else {
                // 未登录
                if (res.code == 401 && !isShowAlert) {
                    isShowAlert = true;
                    MessageBox.alert('当前状态未登录或退出登录，请重新登录', '提示', {
                        confirmButtonText: '去登录',
                        showClose: false,
                        type: 'warning'
                    }).then(() => {
                        isShowAlert = false;
                        removeToken();
                        location.reload()
                    })
                } else {
                    Message({
                        message: res.msg || res.info || res.message,
                        type: 'error',
                        duration: 5 * 1000
                    })
                }
            }
            return Promise.reject(new Error(res.msg || res.info || res.message || 'Error'))
        } else {
            return res
        }
    },
    error => {
        console.log('err' + error) // for debug
        if (error.response) {
            if (error.response.status == 401 || error.response.data.code == 401) {
                // 判断token失效退出登录
                isShowAlert = true;
                MessageBox.alert('当前状态未登录或退出登录，请重新登录', '提示', {
                    confirmButtonText: '去登录',
                    showClose: false,
                    type: 'warning'
                }).then(() => {
                    isShowAlert = false;
                    removeToken();
                    location.reload()
                })
            } else {
                Message({
                    message: error.response.data.data || error.response.data.msg || error.response.data.info || error.info || error.msg || error,
                    type: 'error',
                    duration: 5 * 1000
                })
            }
        }
        // else {
        //     if (error != "Cancel") {
        //         Message({
        //             message: error,
        //             type: 'error',
        //             duration: 5 * 1000
        //         })
        //     }
        // }
        return Promise.reject(error)
    }
)

export default service